﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using Itau.IM.Carimbador.Contract;
using Itau.IM.Carimbador.EntityObject;
using Itau.IM.Common.Mainframe.Book;

namespace Itau.IM.Carimbador.Implementation
{
    public class BookParserImpl
    {
        /// <summary>
        /// Método responsável por gerar o book de entrada do mainframe
        /// </summary>
        /// <param name="request_">Objeto de requisição</param>
        /// <returns>Texto do Book</returns>
    [Obsolete("Método em desuso. Utilizar o Parser de Book genérico")]
        public string ParseEntradaRegularComPrazo(ConsultarRegularComPrazoRequest request_)
        {
            StringBuilder bookEntrada = new StringBuilder();

            #region Validação

            if (request_.Parametros == null)
            {
                throw new Exception("Ao menos um parâmetro de entrada deverá ser informado.");
            }
            else
            {
                if (request_.Parametros.Count > 40)
                {
                    throw new Exception("Número máximo de parâmetros excedido (40).");
                }
            }

            #endregion Validação

            #region Composição do Book - Entrada

            //Tipo de Fluxo (Numérico de 1 posição)
            bookEntrada.Append("   0");

            //Flag Recarimbo (Numérico de 1 posição)
            bookEntrada.Append(request_.FlagRecarimbo);

            //Produto Financeiro (Numérico de 9 posições)
            bookEntrada.Append(request_.CodigoProdutoFinanceiroDerivado.ToString().PadLeft(9, '0'));

            //Prazo de Vencimento (Alfanumérico de 10 posições) - dd.MM.yyyy
            bookEntrada.Append(request_.PrazoVencimento.ToString("dd.MM.yyyy"));

            //Data da Operação (Alfanumérico de 10 posições) - dd.MM.yyyy
            bookEntrada.Append(request_.DataHoraOperacao.ToString("dd.MM.yyyy"));

            //Hora da Operação (Opcional) (Alfanumérico de 8 posições) - hh.mm.ss
            bookEntrada.Append(request_.DataHoraOperacao.ToString("hh.mm.ss"));

            //Quantidade de Parâmetros (Numérico de 2 posições)
            bookEntrada.Append(request_.Parametros.Count.ToString().PadLeft(2, '0'));


            //Nomes dos Parâmetros (Alfanumérico de 39 posições por par parâmetro - valor)
            for (int i = 0; i < 40; i++)
            {
                if (request_.Parametros.Count > i)
                {
                    bookEntrada.Append(request_.Parametros[i].Nome.PadLeft(9, '0'));
                    bookEntrada.Append(request_.Parametros[i].Valor.PadRight(30, ' '));
                }
                else
                {
                    bookEntrada.Append(' ', 39);
                }
            }

            //Nome do Usuário (Alfanumérico de 20 posições)
            bookEntrada.Append(request_.NomeUsuario.PadRight(20, ' '));

            bookEntrada.Append('0', 4);

            //Lista de Fluxo de Caixa, fixo 1000 vezes
            for (int i = 0; i < 1000; i++)
            {
                //Data de Vencimento (Alfanumérico de 10 posições) - dd.MM.yyyy
                bookEntrada.Append(' ', 10);

                //Valor do Ponto (Númerico de 18 posições)
                bookEntrada.Append('0', 18);
            }

            //Base da Taxa (Númerico de 1 posição)
            bookEntrada.Append((int)request_.BaseConversao);

            //Tipo de Amortização (Númerico de 1 posição)
            bookEntrada.Append('0');

            //Taxa da Operação (Númerico de 8 posições)
            bookEntrada.Append('0', 8);

            //Base da Taxa da Operação (Númerico de 3 posições)
            bookEntrada.Append('0', 3);

            //Base da TIR (Númerico de 3 posições)
            bookEntrada.Append('0', 3);

            //Data de Referência da Operação (Alfanúmerico de 10 posições)
            bookEntrada.Append(' ', 10);

            //Filler(Alfanumérico de 26 posições)
            bookEntrada.Append(' ', 26);

            //Área de rechamada
            if (request_.AreaRechamada != null)
            {
                //Código da Primeira Curva (Numérico de 8 posições)
                bookEntrada.Append(request_.AreaRechamada.CodigoPrimeiraCurva.ToString().PadLeft(8, '0'));

                //Data da Primeira Curva (Alfanumérico de 10 posições - dd.MM.yyyy
                bookEntrada.Append(request_.AreaRechamada.DataPtoPrimeiraCurva.ToString("dd.MM.yyyy"));

                //Código da Terceira Curva (Numérico de 8 posições)
                bookEntrada.Append(request_.AreaRechamada.CodigoTerceiraCurva.ToString().PadLeft(8, '0'));

                //Data da Terceira Curva (Alfanumérico de 10 posições - dd.MM.yyyy
                bookEntrada.Append(request_.AreaRechamada.DataPtoTerceiraCurva.ToString("dd.MM.yyyy"));
            }
            else
            {
                bookEntrada.Append(' ', 36);
            }

            //Filler (Alfanumérico de 1287 posições)
            bookEntrada.Append(' ', 1287);

            #endregion Composição do Book - Entrada

            return bookEntrada.ToString();
        }

        /// <summary>
        /// Método responsável por converter o book de saída no objeto de reposta correspondente
        /// </summary>
        /// <param name="bookSaida_">Texto do book</param>
        /// <returns>Objeto de resposta</returns>
    [Obsolete("Método em desuso. Utilizar o Parser de Book genérico")]
        public ConsultarRegularComPrazoResponse ParseSaidaRegularComPrazo(string bookSaida_)
        {
            ConsultarRegularComPrazoResponse resposta = new ConsultarRegularComPrazoResponse();
            BookReader reader = new BookReader(bookSaida_);

            string indicadorErro = null;
            string sqlCode = null;
            string nomeTabela = null;
            string campoErro = null;
            string retornoExterno = null;
            string pontoErro = null;
            string chavesPesquisa = null;
            string nomePrograma = null;
            string sqlErroMc = null;

            #region Leitura do Book - Saída

            //Código da Primeira Curva (Numérico de 8 posições)
            string codigoPrimeiraCurva = reader.Read(8);

            if (!String.IsNullOrEmpty(codigoPrimeiraCurva.Trim()))
            {
                resposta.CodigoPrimeiraCurva = Convert.ToInt32(codigoPrimeiraCurva);
            }

            //Valor do Transfer Price (Numérico de 18 posições)
            string valorTransferPrice = reader.Read(18);

            if (!String.IsNullOrEmpty(valorTransferPrice.Trim()))
            {
                resposta.ValorTransferPrice = Convert.ToDouble(valorTransferPrice) / 10000000000;
            }

            //Código da Terceira Curva (Numérico de 8 posições)
            string codigoTerceiraCurva = reader.Read(8);

            if (!String.IsNullOrEmpty(codigoTerceiraCurva.Trim()))
            {
                resposta.CodigoTerceiraCurva = Convert.ToInt32(codigoTerceiraCurva);
            }

            //Valor do Transfer Price 3ª curva (Numérico de 18 posições)
            string valorTransferPriceTerceiraCurva = reader.Read(18);

            if (!String.IsNullOrEmpty(valorTransferPriceTerceiraCurva.Trim()))
            {
                resposta.ValorTransferPriceTerceiraCurva = Convert.ToDouble(valorTransferPriceTerceiraCurva) / 10000000000;
            }

            //Flag utilização da Curva Default (Numérico de 1 posição)
            string flagUtilizacaoCurvaDefault = reader.Read(1);

            if (!String.IsNullOrEmpty(flagUtilizacaoCurvaDefault.Trim()))
            {
                resposta.FlagUtilizacaoCurvaDefault = Convert.ToInt32(flagUtilizacaoCurvaDefault);
            }

            //Código de Tipo de Valor (Numérico de 1 posição)
            string codigoTipoValor = reader.Read(1);

            if (!String.IsNullOrEmpty(codigoTipoValor.Trim()))
            {
                resposta.CodigoTipoValor = Convert.ToInt32(codigoTipoValor);
            }

            //Filler (Alfanumérico de 30946 posições)
            reader.Move(30946);

            #endregion Leitura do Book - Saída

            #region Leitura do Book - Controle

            //Indicador de Erro
            indicadorErro = reader.Read(2);

            //Código de Erro
            string codigoErro = reader.Read(3);

            if (!String.IsNullOrEmpty(codigoErro.Trim()))
            {
                resposta.CodigoRetorno = Convert.ToInt32(codigoErro);
            }

            //SQL Code
            sqlCode = reader.Read(4);

            //Nome da Tabela
            nomeTabela = reader.Read(16);

            //Campo com Erro
            campoErro = reader.Read(15);

            //Mensagem de Erro
            resposta.MensagemRetorno = reader.Read(50).Trim();

            //Código de Retorno Externo
            retornoExterno = reader.Read(2);

            //Ponto do Erro
            pontoErro = reader.Read(4);

            //Chaves de Pesquisa
            chavesPesquisa = reader.Read(40);

            //Nome do Programa
            nomePrograma = reader.Read(20);

            //SQL ERRMC
            sqlErroMc = reader.Read(20);

            #endregion Leitura do Book - Controle

            return resposta;
        }

        /// <summary>
        /// Método responsável por gerar o book de entrada do mainframe
        /// </summary>
        /// <param name="request_">Objeto de requisição</param>
        /// <returns>Texto do Book</returns>
    [Obsolete("Método em desuso. Utilizar o Parser de Book genérico")]
        public string ParseEntradaRegularSemPrazo(ConsultarRegularSemPrazoRequest request_)
        {
            StringBuilder bookEntrada = new StringBuilder();

            #region Validação

            if (request_.Parametros == null)
            {
                throw new Exception("Ao menos um parâmetro de entrada deverá ser informado.");
            }
            else
            {
                if (request_.Parametros.Count > 40)
                {
                    throw new Exception("Número máximo de parâmetros excedido (40).");
                }
            }

            #endregion Validação

            #region Composição do Book - Entrada

            //Tipo de Fluxo (Numérico de 1 posição)
            bookEntrada.Append("   1");

            //Flag Recarimbo (Numérico de 1 posição)
            bookEntrada.Append(request_.FlagRecarimbo);

            //Produto Financeiro (Numérico de 9 posições)
            bookEntrada.Append(request_.CodigoProdutoFinanceiroDerivado.ToString().PadLeft(9, '0'));

            //Prazo de Vencimento (Alfanumérico de 10 posições) - dd.MM.yyyy
            bookEntrada.Append(' ', 10);

            //Data da Operação (Alfanumérico de 10 posições) - dd.MM.yyyy
            bookEntrada.Append(request_.DataHoraOperacao.ToString("dd.MM.yyyy"));

            //Hora da Operação (Opcional) (Alfanumérico de 8 posições) - hh.mm.ss
            bookEntrada.Append(request_.DataHoraOperacao.ToString("hh.mm.ss"));

            //Quantidade de Parâmetros (Numérico de 2 posições)
            bookEntrada.Append(request_.Parametros.Count.ToString().PadLeft(2, '0'));


            //Nomes dos Parâmetros (Alfanumérico de 39 posições por par parâmetro - valor)
            for (int i = 0; i < 40; i++)
            {
                if (request_.Parametros.Count > i)
                {
                    bookEntrada.Append(request_.Parametros[i].Nome.PadLeft(9, '0'));
                    bookEntrada.Append(request_.Parametros[i].Valor.PadRight(30, ' '));
                }
                else
                {
                    bookEntrada.Append(' ', 39);
                }
            }

            //Nome do Usuário (Alfanumérico de 20 posições)
            bookEntrada.Append(request_.NomeUsuario.PadRight(20, ' '));

            bookEntrada.Append('0', 4);

            //Lista de Fluxo de Caixa, fixo 1000 vezes
            for (int i = 0; i < 1000; i++)
            {
                //Data de Vencimento (Alfanumérico de 10 posições) - dd.MM.yyyy
                bookEntrada.Append(' ', 10);

                //Valor do Ponto (Númerico de 18 posições)
                bookEntrada.Append('0', 18);
            }

            //Base da Taxa (Númerico de 1 posição)
            bookEntrada.Append((int)request_.BaseConversao);

            //Tipo de Amortização (Númerico de 1 posição)
            bookEntrada.Append('0');

            //Taxa da Operação (Númerico de 8 posições)
            bookEntrada.Append('0', 8);

            //Base da Taxa da Operação (Númerico de 3 posições)
            bookEntrada.Append('0', 3);

            //Base da TIR (Númerico de 3 posições)
            bookEntrada.Append('0', 3);

            //Data de Referência da Operação (Alfanúmerico de 10 posições)
            bookEntrada.Append(' ', 10);

            //Filler(Alfanumérico de 26 posições)
            bookEntrada.Append(' ', 26);

            //Área de rechamada
            if (request_.AreaRechamada != null)
            {
                //Código da Primeira Curva (Numérico de 8 posições)
                bookEntrada.Append(request_.AreaRechamada.CodigoPrimeiraCurva.ToString().PadLeft(8, '0'));

                //Data da Primeira Curva (Alfanumérico de 10 posições - dd.MM.yyyy
                bookEntrada.Append(request_.AreaRechamada.DataPtoPrimeiraCurva.ToString("dd.MM.yyyy"));

                //Código da Terceira Curva (Numérico de 8 posições)
                bookEntrada.Append(request_.AreaRechamada.CodigoTerceiraCurva.ToString().PadLeft(8, '0'));

                //Data da Terceira Curva (Alfanumérico de 10 posições - dd.MM.yyyy
                bookEntrada.Append(request_.AreaRechamada.DataPtoTerceiraCurva.ToString("dd.MM.yyyy"));
            }
            else
            {
                bookEntrada.Append(' ', 36);
            }

            //Filler (Alfanumérico de 1287 posições)
            bookEntrada.Append(' ', 1287);

            #endregion Composição do Book - Entrada

            return bookEntrada.ToString();
        }

        /// <summary>
        /// Método responsável por converter o book de saída no objeto de reposta correspondente
        /// </summary>
        /// <param name="bookSaida_">Texto do book</param>
        /// <returns>Objeto de resposta</returns>
    [Obsolete("Método em desuso. Utilizar o Parser de Book genérico")]
        public ConsultarRegularSemPrazoResponse ParseSaidaRegularSemPrazo(string bookSaida_)
        {
            ConsultarRegularSemPrazoResponse resposta = new ConsultarRegularSemPrazoResponse();
            resposta.PrimeiraCurva = new List<PontoCurvaEO>();
            resposta.TerceiraCurva = new List<PontoCurvaEO>();

            BookReader reader = new BookReader(bookSaida_);

            string indicadorErro = null;
            string sqlCode = null;
            string nomeTabela = null;
            string campoErro = null;
            string retornoExterno = null;
            string pontoErro = null;
            string chavesPesquisa = null;
            string nomePrograma = null;
            string mensagemErroSQL = null;
            int quantidadePontosPrimeiraCurva = 0;
            int quantidadePontosTerceiraCurva = 0;

            #region Leitura do Book - Saída

            //Código da Primeira Curva (Numérico de 8 posições)
            string codigoPrimeiraCurva = reader.Read(8);

            if (!String.IsNullOrEmpty(codigoPrimeiraCurva.Trim()))
            {
                resposta.CodigoPrimeiraCurva = Convert.ToInt32(codigoPrimeiraCurva);
            }

            //Quantidade de Pontos da Primeira Curva (Numérico de 6 posições)
            string tempQuantidadePontosPrimeiraCurva = reader.Read(6);

            if (!String.IsNullOrEmpty(tempQuantidadePontosPrimeiraCurva.Trim()))
            {
                quantidadePontosPrimeiraCurva = Convert.ToInt32(tempQuantidadePontosPrimeiraCurva);
            }

            //Valores da Primeira Curva (Numérico de 18 posições) - Máximo 300 pontos
            for (int i = 0; i < 300; i++)
            {
                if (i < quantidadePontosPrimeiraCurva)
                {
                    double valor = Convert.ToDouble(reader.Read(18)) / 10000000000;
                    DateTime data = DateTime.ParseExact(reader.Read(10), "dd.MM.yyyy", CultureInfo.InvariantCulture);
                    int quantidadeDiasCorridos;
                    int quantidadeDiasUteis;

                    Int32.TryParse(reader.Read(8), out quantidadeDiasCorridos);
                    Int32.TryParse(reader.Read(8), out quantidadeDiasUteis);
                    
                    resposta.PrimeiraCurva.Add(new PontoCurvaEO(data, valor, quantidadeDiasCorridos, quantidadeDiasUteis));
                }
                else
                {
                    reader.Move(44);
                }
            }

            //Código da Terceira Curva (Numérico de 8 posições)
            string codigoTerceiraCurva = reader.Read(8);

            if (!String.IsNullOrEmpty(codigoTerceiraCurva.Trim()))
            {
                resposta.CodigoTerceiraCurva = Convert.ToInt32(codigoTerceiraCurva);
            }

            //Quantidade de Pontos da Primeira Curva (Numérico de 6 posições)
            string tempQuantidadePontosTerceiraCurva = reader.Read(6);

            if (!String.IsNullOrEmpty(tempQuantidadePontosTerceiraCurva.Trim()))
            {
                quantidadePontosPrimeiraCurva = Convert.ToInt32(tempQuantidadePontosTerceiraCurva);
            }

            //Valores da Primeira Curva (Numérico de 18 posições) - Máximo 300 pontos
            for (int i = 0; i < 300; i++)
            {
                if (i < quantidadePontosTerceiraCurva)
                {
                    double valor = Convert.ToDouble(reader.Read(18)) / 10000000000;
                    DateTime data = DateTime.ParseExact(reader.Read(10), "dd.MM.yyyy", CultureInfo.InvariantCulture);
                    int quantidadeDiasCorridos;
                    int quantidadeDiasUteis;

                    Int32.TryParse(reader.Read(8), out quantidadeDiasCorridos);
                    Int32.TryParse(reader.Read(8), out quantidadeDiasUteis);
                    
                    resposta.TerceiraCurva.Add(new PontoCurvaEO(data, valor, quantidadeDiasCorridos, quantidadeDiasUteis));
                }
                else
                {
                    reader.Move(44);
                }
            }
            
            //Flag de Utilização da curva default (Numérico de 1 posição)
            string flagCurvaDefault = reader.Read(1);

            if (!String.IsNullOrEmpty(flagCurvaDefault.Trim()))
            {
                resposta.FlagUtilizacaoCurvaDefault = Convert.ToInt32(flagCurvaDefault);
            }

            //Código de Tipo de Valor (Numérico de 1 posição)
            string codigoTipoValor = reader.Read(1);

            if (!String.IsNullOrEmpty(codigoTipoValor.Trim()))
            {
                resposta.CodigoTipoValor = Convert.ToInt32(codigoTipoValor);
            }

            //Indicador do Fim da Primeira Curva (Numérico de 1 posição)
            string indicadorFimPrimeiraCurva = reader.Read(1);

            if (!string.IsNullOrEmpty(indicadorFimPrimeiraCurva))
            {
                resposta.IndicadorFimPrimeiraCurva = indicadorFimPrimeiraCurva[0];
            }

            //Indicador do Fim da Terceira Curva (Numérico de 1 posição)
            string indicadorFimTerceiraCurva = reader.Read(1);

            if (!string.IsNullOrEmpty(indicadorFimTerceiraCurva))
            {
                resposta.IndicadorFimTerceiraCurva = indicadorFimTerceiraCurva[0];
            }

            //Filler (Alfanumérico de 4568 posições)
            reader.Move(4568);

            #endregion Leitura do Book - Saída

            #region Leitura do Book - Controle

            //Indicador de Erro
            indicadorErro = reader.Read(2);

            //Código de Erro
            string codigoErro = reader.Read(3);

            if (!String.IsNullOrEmpty(codigoErro.Trim()))
            {
                resposta.CodigoRetorno = Convert.ToInt32(codigoErro);
            }

            //SQL Code
            sqlCode = reader.Read(4);

            //Nome da Tabela
            nomeTabela = reader.Read(16);

            //Campo com Erro
            campoErro = reader.Read(15);

            //Mensagem de Erro
            resposta.MensagemRetorno = reader.Read(50).Trim();

            //Código de Retorno Externo
            retornoExterno = reader.Read(2);

            //Ponto do Erro
            pontoErro = reader.Read(4);

            //Chaves de Pesquisa
            chavesPesquisa = reader.Read(40);

            //Nome do Programa
            nomePrograma = reader.Read(20);

            //SQLERRMC
            mensagemErroSQL = reader.Read(20);

            #endregion Leitura do Book - Controle

            return resposta;
        }

        /// <summary>
        /// Método responsável por gerar o book de entrada do mainframe
        /// </summary>
        /// <param name="request_">Objeto de requisição</param>
        /// <returns>Texto do Book</returns>
    //[Obsolete("Método em desuso. Utilizar o Parser de Book genérico")]
    //    public string ParseEntradaIrregegular(ConsultarIrregularRequest request_)
    //    {
    //        StringBuilder bookEntrada = new StringBuilder();

    //        #region Validação

    //        if (request_.Parametros == null)
    //        {
    //            throw new Exception("Ao menos um parâmetro de entrada deverá ser informado.");
    //        }
    //        else
    //        {
    //            if (request_.Parametros.Count > 40)
    //            {
    //                throw new Exception("Número máximo de parâmetros excedido (40).");
    //            }
    //        }

    //        #endregion Validação

    //        #region Composição do Book - Entrada

    //        //Tipo de Fluxo (Numérico de 1 posição)
    //        bookEntrada.Append("   2");

    //        //Flag Recarimbo (Numérico de 1 posição)
    //        bookEntrada.Append(request_.FlagRecarimbo);

    //        //Produto Financeiro (Numérico de 9 posições)
    //        bookEntrada.Append(request_.CodigoProdutoFinanceiroDerivado.ToString().PadLeft(9, '0'));

    //        //Prazo de Vencimento (Alfanumérico de 10 posições) - dd.MM.yyyy
    //        bookEntrada.Append(' ', 10);

    //        //Data da Operação (Alfanumérico de 10 posições) - dd.MM.yyyy
    //        bookEntrada.Append(request_.DataHoraOperacao.ToString("dd.MM.yyyy"));

    //        //Hora da Operação (Opcional) (Alfanumérico de 8 posições) - hh.mm.ss
    //        bookEntrada.Append(request_.DataHoraOperacao.ToString("hh.mm.ss"));

    //        //Quantidade de Parâmetros (Numérico de 2 posições)
    //        bookEntrada.Append(request_.Parametros.Count.ToString().PadLeft(2, '0'));

    //        //Nomes dos Parâmetros (Alfanumérico de 39 posições por par parâmetro - valor)
    //        for (int i = 0; i < 40; i++)
    //        {
    //            if (request_.Parametros.Count > i)
    //            {
    //                bookEntrada.Append(request_.Parametros[i].Nome.PadLeft(9, '0'));
    //                bookEntrada.Append(request_.Parametros[i].Valor.PadRight(30, ' '));
    //            }
    //            else
    //                bookEntrada.Append(' ', 39);
    //        }

    //        //Nome do Usuário (Alfanumérico de 20 posições)
    //        bookEntrada.Append(request_.NomeUsuario.PadRight(20, ' '));

    //        //Quantidade de Fluxos de Caixa
    //        bookEntrada.Append(request_.FluxoCaixa.Count.ToString().PadLeft(4,'0'));

    //        //Lista de Fluxo de Caixa, fixo 1000 vezes
    //        for (int i = 0; i < 1000; i++)
    //        {
    //            if (i < request_.FluxoCaixa.Count)
    //            {
    //                //Data de Vencimento (Alfanumérico de 10 posições) - dd.MM.yyyy
    //                bookEntrada.Append(request_.FluxoCaixa[i].Data.ToString("dd.MM.yyyy"));

    //                //Valor do Ponto (Númerico de 18 posições)
    //                bookEntrada.Append(request_.FluxoCaixa[i].Valor.ToString("00000000.0000000000").Replace(System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, String.Empty));
    //            }
    //            else
    //            {
    //                bookEntrada.Append(' ', 10);
    //                bookEntrada.Append('0', 18);
    //            }
    //        }

    //        //Taxa Líquida Diária (Númerico de 18 posições)
    //        bookEntrada.Append(request_.TaxaLiquidaDiaria.ToString("00000000.0000000000").Replace(System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, String.Empty));

    //        //Valor do Contrato (Alfanumérico de 18 posições)
    //        bookEntrada.Append(request_.ValorTotalContrato.ToString().PadRight(18, ' '));

    //        //Data de Desconto (Alfanumérico de 10 posições) - dd.MM.yyyy
    //        bookEntrada.Append(request_.DataDesconto.ToString("dd.MM.yyyy"));

    //        //Precisão (Alfanumérico de 6 posições)
    //        bookEntrada.Append(System.Math.Floor(request_.Precisao).ToString().PadRight(6, ' '));

    //        //Área de rechamada
    //        if (request_.AreaRechamada != null)
    //        {
    //            //Código da Primeira Curva (Numérico de 8 posições)
    //            bookEntrada.Append(request_.AreaRechamada.CodigoPrimeiraCurva.ToString().PadLeft(8, '0'));

    //            //Data da Primeira Curva (Alfanumérico de 10 posições - dd.MM.yyyy
    //            bookEntrada.Append(request_.AreaRechamada.DataPtoPrimeiraCurva.ToString("dd.MM.yyyy"));

    //            //Código da Terceira Curva (Numérico de 8 posições)
    //            bookEntrada.Append(request_.AreaRechamada.CodigoTerceiraCurva.ToString().PadLeft(8, '0'));

    //            //Data da Terceira Curva (Alfanumérico de 10 posições - dd.MM.yyyy
    //            bookEntrada.Append(request_.AreaRechamada.DataPtoTerceiraCurva.ToString("dd.MM.yyyy"));
    //        }
    //        else
    //            bookEntrada.Append(' ', 36);

    //        //Filler (Alfanumérico de 1287 posições)
    //        bookEntrada.Append(' ', 1287);

    //        #endregion Composição do Book - Entrada

    //        return bookEntrada.ToString();
    //    }

        /// <summary>
        /// Método responsável por converter o book de saída no objeto de reposta correspondente
        /// </summary>
        /// <param name="bookSaida_">Texto do book</param>
        /// <returns>Objeto de resposta</returns>
    //[Obsolete("Método em desuso. Utilizar o Parser de Book genérico")]
    //    public ConsultarIrregularResponse ParseSaidaIrregular(string bookSaida_)
    //    {
    //        ConsultarIrregularResponse resposta = new ConsultarIrregularResponse();
    //        BookReader reader = new BookReader(bookSaida_);

    //        string indicadorErro = null;
    //        string codigoErro = null;
    //        string sqlCode = null;
    //        string nomeTabela = null;
    //        string campoErro = null;
    //        string retornoExterno = null;
    //        string pontoErro = null;
    //        string chavesPesquisa = null;
    //        string nomePrograma = null;
    //        string mensagemErroSQL = null;

    //        #region Leitura do Book - Saída

    //        //Código da Primeira Curva (Numérico de 8 posições)
    //        string codigoPrimeiraCurva = reader.Read(8);

    //        if (!String.IsNullOrEmpty(codigoPrimeiraCurva.Trim()))
    //        {
    //            resposta.CodigoPrimeiraCurva = Convert.ToInt32(codigoPrimeiraCurva);
    //        }

    //        //Valor do Transfer Price (Numérico de 18 posições)
    //        resposta.ValorTransferPrice = Convert.ToDouble(reader.Read(18)) / 10000000000;

    //        //Código da Terceira Curva (Numérico de 8 posições)
    //        string codigoTerceiraCurva = reader.Read(8);

    //        if (!String.IsNullOrEmpty(codigoTerceiraCurva.Trim()))
    //        {
    //            resposta.CodigoTerceiraCurva = Convert.ToInt32(codigoTerceiraCurva);
    //        }

    //        //Valor do Transfer Price Terceira curva (Numérico de 18 posições)
    //        resposta.ValorTransferPriceTerceiraCurva = Convert.ToDouble(reader.Read(18)) / 10000000000;

    //        //Flag de Utiliação da curva default (Numérico de 1 posição)
    //        string flagCurvaDefault = reader.Read(1);

    //        if (!String.IsNullOrEmpty(flagCurvaDefault.Trim()))
    //        {
    //            resposta.FlagUtilizacaoCurvaDefault = Convert.ToInt32(flagCurvaDefault);
    //        }

    //        //Código de Tipo de Valor (Numérico de 1 posição)
    //        string codigoTipoValor = reader.Read(1);

    //        if (!String.IsNullOrEmpty(codigoTipoValor.Trim()))
    //        {
    //            resposta.CodigoTipoValor = Convert.ToInt32(codigoTipoValor);
    //        }

    //        //Filler (Alfanumérico de 30946 posições)
    //        reader.Move(30946);

    //        #endregion Leitura do Book - Saída

    //        #region Leitura do Book - Controle

    //        //Indicador de Erro
    //        indicadorErro = reader.Read(2);

    //        //Código de Erro
    //        codigoErro = reader.Read(5);

    //        //SQL Code
    //        sqlCode = reader.Read(4);

    //        if (!String.IsNullOrEmpty(sqlCode.Trim()))
    //        {
    //            resposta.CodigoRetorno = Convert.ToInt32(sqlCode.Replace("+", String.Empty));
    //        }

    //        //Nome da Tabela
    //        nomeTabela = reader.Read(16);

    //        //Campo com Erro
    //        campoErro = reader.Read(15);

    //        //Mensagem de Erro
    //        resposta.MensagemRetorno = reader.Read(50);

    //        //Código de Retorno Externo
    //        retornoExterno = reader.Read(2);

    //        //Ponto do Erro
    //        pontoErro = reader.Read(4);

    //        //Chaves de Pesquisa
    //        chavesPesquisa = reader.Read(40);

    //        //Nome do Programa
    //        nomePrograma = reader.Read(20);

    //        //SQLERRMC
    //        mensagemErroSQL = reader.Read(20);

    //        #endregion Leitura do Book - Controle

    //        return resposta;
    //    }
    }
}